8
תגובות

מניעת xss דרך javascript

פתח itamar ,
יש לי באתר אפשרות הוספת תגובה, ברגע שהמשתמש רושם תגובה אני מכניס אותה ל db דרך ajax ומפרסם את התגובה דרך ה javascript כלומר אני לא מקבל את התגובה מה db אלא לוקח אותה מה form השאלה שלי היא איך אני יכול למנוע xss בצד הלקוח בלבד?
ניסיתי להשתמש ב encodeURIComponent אבל משום מה הוא ממיר לי גם אותיות בעברית. מישהו יודע מה הדרך הכי נוחה לסנן את הקלט בלי התערבות של השרת?

8 תשובות

avatar ענה itamar ב 22 לינואר 2014 #

כרגע אני משתמש בקוד הזה לסינון זה מספיק מאובטח?

function encodeHTML(s) {
          return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
      }

avatar ענה vu47678 ב 22 לינואר 2014 #

function clean(e){
  var textfield = document.getElementById(e);
  var regex = /[^a-z 0-9?!.,]/gi;
  if(textfield.value.search(regex) > -1) {
    textfield.value = textfield.value.replace(regex, "");
    }
}

avatar ענה vu47678 ב 22 לינואר 2014 #

מה שהקוד עושה בודק אם יש משהו אחר חוץ מהרגקס שהגדרת ומחליף אותו בתו ריק

avatar ענה vu47678 ב 22 לינואר 2014 #

אני אפילו יתן לך קוד משודרג שלא נותן למשתמש אפילו להקליד משהו שלא הגדרת ומוחק לו אותו ישר שהוא כותב אותו.

function clean(e){
  var textfield = document.getElementById(e);
  var regex = /[^a-z 0-9?!.,]/gi;
  if(textfield.value.search(regex) > -1) {
    textfield.value = textfield.value.replace(regex, "");
    }
}

 <div>
       
        <textarea id="comment" name="ta" onkeyup="clean('comment')" onkeydown="clean('comment')"></textarea>
      </div>

avatar ענה itamar ב 23 לינואר 2014 #

תודה רבה עובד מצוין!!!

avatar ענה OrelBeY ב 23 לינואר 2014 #

זה נחמד והכול, אבל אתה לא צריך להגביל את הטקסט למספר תווים מסוימים רק כדי לסתום פריצת XSS; אתה יכול פשוט להשתמש בפונקציות שימירו את התווים המיוחדים ל-HTML Entities (כך שהם עדיין יישמרו - צריך את זה בהמון מקרים - ולא יזיקו!). וחוץ מזה, אתה לא שולט על איך הלקוח שולח לך נתונים. זה נחמד ויעיל לסנן נתונים בצד הלקוח, אבל מבחינת אבטחה - תצטרך גם לסנן את זה בצד השרת! תמיד! הטופס הזה זה לא הדרך היחידה לשלוח לך נתונים, וגם את הטופס והסקריפט האלה אפשר לשנות בדפדפן הלקוח (כל אחד בפני עצמו), שזו דרך אחת לרמות למשל.
אני ממליץ לך לקרוא את המדריך שפורסם כאן בנושא XSS.

avatar ענה itamar ב 23 לינואר 2014 #

אוראל אל תדאג אני מסנן את זה גם בשרת ע"י html_entities אבל כאן זה לצורך אחר, כדי שהמשתמש יראה מיד שהתגובה שלו נוספה ללא צורך בריפרוש הדף
וחוץ מזה אני חושב שזה מצוין להגביל את המשתמש עוד בקלט

avatar ענה OrelBeY ב 23 לינואר 2014 #

למה? אבל יכול להיות שהייתה תקלה בביצוע של הסקריפט בצד השרת, והתגובה לא נוספה. אם בכל זאת תרצה את זה תצטרך להשתמש ב-AJAX. :-)
אני מסכים איתך, אבל יש גבול להגבלה. :-) זו תגובה, נכון? לך תדע איזה תווים יכולים להיות שם. מה עם מקף? קו מפריד? נקודה-פסיק? סימן הסעיף (§)? סימנים מיוחדים אחרים? תגובה כדאי פשוט לא להגביל בסוג התווים במחרוזת הקלט, ולמניעת XSS פשוט להבריח את התווים המיוחדים ב-HTML.